#include <my_header.h>
#include <string.h>
#define BUF_SIZE 4096

/* Usage: mkfifo 创建管道文件 */
int main(int argc, char *argv[]){    
    // 创建管道
    mkfifo("1.pipe", 0644);
    mkfifo("2.pipe", 0644);

    // 打开管道
    int fd_write = open("1.pipe", O_WRONLY);
    ERROR_CHECK(fd_write, -1, "fd1_write");
    int fd_read = open("2.pipe", O_RDONLY);
    ERROR_CHECK(fd_read, -1, "fd1_read");

    // 创建缓冲数组
    char sendbuf[BUF_SIZE] = {0};
    char recvbuf[BUF_SIZE] = {0};
    int time_remaining = 10;        // 剩余时间

    while(1){
        // 设置select监听
        fd_set fds;                 // 监听
        FD_ZERO(&fds);              // 初始化
        FD_SET(fd_read, &fds);      // 监听输入
        FD_SET(STDIN_FILENO, &fds); // 监听标准输出

        // 每次等待5s
        struct timeval tv = {1, 0}; 

        // 显示剩余的时间
        printf("\r等待操作[剩余时间: %d秒] (输入消息或正在等待B的回复)...\r\n  ", time_remaining);
        fflush(stdout);

        // select监听
        int ret = select(fd_read + 1, &fds, NULL, NULL, &tv); // tv是超时标志

        if(ret == -1){      // 选择错误处理
            perror("选择错误");
            break;
        }
        if(ret == 0){  // 此刻(s)未接受到信息处理
            if(--time_remaining <= 0){  // 超时处理
                printf("\n时间用尽，程序退出\n");
                break;
            }
            continue;       // 未超时，继续循环
        }

        // 接受键盘输入并写入管道
        if(FD_ISSET(STDIN_FILENO, &fds)){
            //bzero(recvbuf, sizeof(recvbuf));
            printf("A input > ");
            fflush(stdout);

            ssize_t input_len = read(STDIN_FILENO, sendbuf, sizeof(sendbuf)-1);
            if(input_len <= 0) break;
            sendbuf[input_len] = '\0';
            write(fd_write, sendbuf, input_len);

            time_remaining = 10;
        }
        
        // 从管道读取
        if(FD_ISSET(fd_read, &fds)){
            //bzero(recvbuf, sizeof(recvbuf));
            ssize_t read_count2 = read(fd_read, recvbuf, sizeof(recvbuf));
            if(read_count2 <= 0) break;
            recvbuf[read_count2] = '\0';
            printf("B send > %s ", recvbuf);
            fflush(stdout);

            time_remaining = 10;
        }
    }

    close(fd_write);
    close(fd_read);
    unlink("1.pipe");
    unlink("2.pipe");
    return 0;
}
